package com.code.test.second.str;

/**
 * 541. 反转字符串II
 * 力扣题目链接
 * <p>
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起, 每计数至 2k 个字符，就反转这 2k 个字符中的前 k 个字符。
 * <p>
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * <p>
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 * <p>
 * 示例:
 * <p>
 * 输入: s = "abcdefg", k = 2
 * 输出: "bacdfeg"
 */
public class SCode541 {

    public static void main(String[] args) {
        String input = "abcdefg";
        char[] s = input.toCharArray();
        reverseString(s,2);
        System.out.println(new String(s));
    }

    /**
     * 比如abcdefg，k=2
     * 也就是每隔2k=4个，翻转前面2个
     *
     * @param s
     */
    public static void reverseString(char[] s, int k) {
        for (int i = 0; i < s.length; i += 2 * k) {
            int start = i;
            //这里是如果后面字符串不够了，直接翻转
            //如果字符串够的话，start+k-1 算出本次翻转的结尾索引
            //abcdeft  0,0+2-1=1   4,4+2-1=5
            int end = Math.min(s.length - 1, start + k - 1);
            while (start < end) {
                char tmp = s[start];
                s[start] = s[end];
                s[end] = tmp;
                start++;
                end--;
            }
        }

    }
}
